; s.clock

	GET	h.RegDefs

	AREA	|Scrn$$Code|, CODE

	EXPORT	clock_start
	EXPORT	clock_width
	EXPORT	clock_red_width

	EXPORT	clock_draw
	EXPORT	clock_draw_double

clock_start		DCD	0
clock_width		DCD	0
clock_red_width		DCD	0

; width after subtracting clock_red_width
clock_green_width	DCD	0

; colours of each part of bar
clock_RED	EQU	&14141414
clock_GREEN	EQU	&64646464

clock_red_data		DCD	clock_RED
clock_green_data	DCD	clock_GREEN

; macros to draw a pixel-/word/quad-word-wide clock element
; r0 = scrn_rowsize
; r2 = colour value
; r3 = screen address
; r4 stores initial value of r3
	MACRO
	CLOCK_DRAW_PIXEL
	MOV	r4,r3
	STRB	r2,[r3],r0
	STRB	r2,[r3],r0
	STRB	r2,[r3],r0
	STRB	r2,[r3],r0
	STRB	r2,[r3],r0
	STRB	r2,[r3],r0
	ADD	r3,r4,#1
	MEND

	MACRO
	CLOCK_DRAW_WORD
	MOV	r4,r3
	STR	r2,[r3],r0
	STR	r2,[r3],r0
	STR	r2,[r3],r0
	STR	r2,[r3],r0
	STR	r2,[r3],r0
	STR	r2,[r3],r0
	ADD	r3,r4,#4
	MEND

	; r5-r7 must each contain a copy of r2
	MACRO
	CLOCK_DRAW_QUAD_WORD
	MOV	r4,r3
	STMIA	r3,{r2,r5,r6,r7}
	ADD	r3,r3,r0
	STMIA	r3,{r2,r5,r6,r7}
	ADD	r3,r3,r0
	STMIA	r3,{r2,r5,r6,r7}
	ADD	r3,r3,r0
	STMIA	r3,{r2,r5,r6,r7}
	ADD	r3,r3,r0
	STMIA	r3,{r2,r5,r6,r7}
	ADD	r3,r3,r0
	STMIA	r3,{r2,r5,r6,r7}
	ADD	r3,r4,#16
	MEND

	MACRO
$draw	CLOCK_DRAW
	; first draw quad-words
	CMP	r1,#16
	BLT	$draw.noquads
	MOV	r5,r2
	MOV	r6,r2
	MOV	r7,r2
$draw.quadloop
	CLOCK_DRAW_QUAD_WORD
	SUB	r1,r1,#16
	CMP	r1,#16
	BGE	$draw.quadloop
$draw.noquads
	CMP	r1,#4
	BLT	$draw.nowords
	CLOCK_DRAW_WORD
	SUB	r1,r1,#4
	B	$draw.noquads
$draw.nowords
	CMP	r1,#0
	BEQ	$draw.nopixels
	CLOCK_DRAW_PIXEL
	SUB	r1,r1,#1
	B	$draw.nowords
$draw.nopixels
	MEND

; r0 contains scrn_rowsize
clock_draw
	STMFD	sp!,{r1-r12,lr}
	LDR	r2,clock_red_width
	LDR	r1,clock_width
	CMP	r1,r2
	SUBGE	r3,r1,r2
	MOVLT	r3,#0
	STR	r3,clock_green_width
	MOVGE	r1,r2
	; r1 now contains width of red bar necessary to draw
	LDR	r2,clock_red_data
	LDR	r3,clock_start
draw_red	CLOCK_DRAW
	LDR	r1,clock_green_width
	CMP	r1,#0
	LDMEQFD	sp!,{r1-r12,pc}^
	LDR	r2,clock_green_data
draw_green	CLOCK_DRAW
	LDMFD	sp!,{r1-r12,pc}^

; macros to draw a pixel-/word/quad-word-wide clock element
; with line-doubling
; r0 = scrn_rowsize
; r2 = colour value
; r3 = screen address
; r4 stores initial value of r3
	MACRO
	CLOCK_DRAW_PIXEL_DOUBLE
	MOV	r4,r3
	STRB	r2,[r3],r0,LSR #1
	STRB	r2,[r3],r0,LSR #1
	STRB	r2,[r3],r0,LSR #1
	STRB	r2,[r3],r0,LSR #1
	STRB	r2,[r3],r0,LSR #1
	STRB	r2,[r3],r0,LSR #1
	STRB	r2,[r3],r0,LSR #1
	STRB	r2,[r3],r0,LSR #1
	STRB	r2,[r3],r0,LSR #1
	STRB	r2,[r3],r0,LSR #1
	STRB	r2,[r3],r0,LSR #1
	STRB	r2,[r3],r0,LSR #1
	ADD	r3,r4,#1
	MEND

	MACRO
	CLOCK_DRAW_WORD_DOUBLE
	MOV	r4,r3
	STR	r2,[r3],r0,LSR #1
	STR	r2,[r3],r0,LSR #1
	STR	r2,[r3],r0,LSR #1
	STR	r2,[r3],r0,LSR #1
	STR	r2,[r3],r0,LSR #1
	STR	r2,[r3],r0,LSR #1
	STR	r2,[r3],r0,LSR #1
	STR	r2,[r3],r0,LSR #1
	STR	r2,[r3],r0,LSR #1
	STR	r2,[r3],r0,LSR #1
	STR	r2,[r3],r0,LSR #1
	STR	r2,[r3],r0,LSR #1
	ADD	r3,r4,#4
	MEND

	; r5-r7 must each contain a copy of r2
	MACRO
	CLOCK_DRAW_QUAD_WORD_DOUBLE
	MOV	r4,r3
	STMIA	r3,{r2,r5,r6,r7}
	ADD	r3,r3,r0,LSR #1
	STMIA	r3,{r2,r5,r6,r7}
	ADD	r3,r3,r0,LSR #1
	STMIA	r3,{r2,r5,r6,r7}
	ADD	r3,r3,r0,LSR #1
	STMIA	r3,{r2,r5,r6,r7}
	ADD	r3,r3,r0,LSR #1
	STMIA	r3,{r2,r5,r6,r7}
	ADD	r3,r3,r0,LSR #1
	STMIA	r3,{r2,r5,r6,r7}
	ADD	r3,r3,r0,LSR #1
	STMIA	r3,{r2,r5,r6,r7}
	ADD	r3,r3,r0,LSR #1
	STMIA	r3,{r2,r5,r6,r7}
	ADD	r3,r3,r0,LSR #1
	STMIA	r3,{r2,r5,r6,r7}
	ADD	r3,r3,r0,LSR #1
	STMIA	r3,{r2,r5,r6,r7}
	ADD	r3,r3,r0,LSR #1
	STMIA	r3,{r2,r5,r6,r7}
	ADD	r3,r3,r0,LSR #1
	STMIA	r3,{r2,r5,r6,r7}
	ADD	r3,r4,#16
	MEND

	MACRO
$draw_double	CLOCK_DRAW_DOUBLE
	; first draw quad-words
	CMP	r1,#16
	BLT	$draw_double.noquads
	MOV	r5,r2
	MOV	r6,r2
	MOV	r7,r2
$draw_double.quadloop
	CLOCK_DRAW_QUAD_WORD_DOUBLE
	SUB	r1,r1,#16
	CMP	r1,#16
	BGE	$draw_double.quadloop
$draw_double.noquads
	CMP	r1,#4
	BLT	$draw_double.nowords
	CLOCK_DRAW_WORD_DOUBLE
	SUB	r1,r1,#4
	B	$draw_double.noquads
$draw_double.nowords
	CMP	r1,#0
	BEQ	$draw_double.nopixels
	CLOCK_DRAW_PIXEL_DOUBLE
	SUB	r1,r1,#1
	B	$draw_double.nowords
$draw_double.nopixels
	MEND

; r0 contains scrn_rowsize
clock_draw_double
	STMFD	sp!,{r1-r12,lr}
	LDR	r2,clock_red_width
	LDR	r1,clock_width
	CMP	r1,r2
	SUBGE	r3,r1,r2
	MOVLT	r3,#0
	STR	r3,clock_green_width
	MOVGE	r1,r2
	; r1 now contains width of red bar necessary to draw
	LDR	r2,clock_red_data
	LDR	r3,clock_start
draw_red_double	CLOCK_DRAW_DOUBLE
	LDR	r1,clock_green_width
	CMP	r1,#0
	LDMEQFD	sp!,{r1-r12,pc}^
	LDR	r2,clock_green_data
draw_green_double	CLOCK_DRAW_DOUBLE
	LDMFD	sp!,{r1-r12,pc}^

	END
